;> Command
APPEND BL AEEXPR
 BL OSSTRI
 BL AEDONE
 LDR R0,[ARGP,#PAGE]
 MOV R2,#0
APPENDNO LDRB R3,[R0,#1]
 CMP R3,#&FF
 LDRNEB R3,[R0,#3]
 MOVNE R2,R0
 ADDNE R0,R0,R3
 BNE APPENDNO
 LDRB R3,[R2,#1]
 LDRB R0,[R2,#2]
 ORR R7,R0,R3,LSL #8
 TEQ R2,#0
 MOVEQ R7,#10
 MOV R0,#255
 LDR LINE,[ARGP,#TOP]
 SUB R2,LINE,#2
 MOV R3,#0
 SWI FILE
 BL ENDER
 MOV FACC,R7
 BL IFLT
 MOV FGRD,#0
 BL FTENFQ
 BL FTENFQ
 BL SFIX
 ADD FACC,FACC,#1
 RSB R4,FACC,FACC,LSL #2 ;5
 ADD R4,FACC,R4,LSL #3 ;2
 MOV R4,R4,LSL #2 ;3
 SUB R0,LINE,#2
 MOV R5,#10
 BL RENUM2
 B FSASET
AUTO BL GETTWO
 BL ENDER
00 STMFD SP!,{R4,R5}
 MOV R0,R4
 MOV TYPE,#0
 BL NPRN
 BL INLINE
 BL AUMATCH
 LDR R4,[SP]
 ADD LINE,ARGP,#OUTPUT
 BL INSRT
 BL SETFSA
 LDMFD SP!,{R4,R5}
 ADD R4,R4,R5
 CMP R4,#65280
 BCC %B00
 B FSASET
GETTWO STMFD SP!,{R14}
 MOV R0,#10
 BL SPTSTN
 SUBNE LINE,LINE,#1 ;if not found go backwards
 MOV R4,R0 ;start
 MOV R0,#10
 BL SPACES
 CMP R10,#","
 BNE NO
 BL SPTSTN
 BLEQ SPACES
NO BL DONE
 MOVS R5,R0 ;step
 LDMNEFD SP!,{PC}
 B ERSILL
DELETE BL SPTSTN
 BNE ERSYNT
 MOV R4,R0
 BL SPACES
 CMP R10,#","
 BNE ERCOMM
 BL SPTSTN
 BNE ERSYNT
 MOV R5,R0
 BL REMOVE
 B FSASET
HELP
 [ NOHELP=0
 BL SPACES
 BL LEXTABADR
 MOV R1,#0
 CMP R10,#"."
 BEQ HELPALL1
 CMP R10,#"A"
 BCC HELP1
 CMP R10,#"W"+1
 BCC HELPALLLIMITED
 CMP R10,#&7F
 BCS HELPTOKEN
 ]
HELP1 ADR LINE,HELPTXT
 B STMT
HELPTXT = "!(",THIMEM,"-4)=@%:",TPRINT,"""ARM"
 [ RRX=1
 = "2"
 ]
 = " BBC Basic V assembled on 21&1/2th April 1987"":"
 = "@%=&900:",TPRINT,"""Basic program size """,TTO,"P-",TPAGE,""" bytes"":"
 = TPRINT,"""Basic variables use """,TEND,"-",TLOMEM,""" bytes"":"
 = TPRINT,"""Memory remaining is """,THIMEM,"-",TEND,""" bytes"""
 [ NOHELP=1
 = ":"
 |
 = "'""Help on keyword e.g. HELP HELP or letter 'HELP A' or 'HELP .' for all"":"
 ]
 = "@%=!(",THIMEM,"-4):",TEND,13
 ALIGN
 [ NOHELP=0
HELPALLLIMITED BL VSTRNG
 = "Possible keywords:",10,13,0
 ALIGN
HELPALL LDRB R0,[R2]
 CMP R0,R10
 BEQ HELPALL1
 BCS HELPALLEND
HELPALL01 LDRB R0,[R2],#1
 CMP R0,#&7F
 BCC HELPALL01
 ADD R2,R2,#1
 B HELPALL
HELPALL1 LDRB R0,[R2],#1
 CMP R0,#" "
 BEQ HELPALLEND
 CMP R10,#"."
 CMPNE R0,R10
 BNE HELPALLEND
 CMP R1,#70
 MOVCS R1,#0
 SWICS NEWLINE
 BCS HELPALL12
 CMP R1,#0
 BEQ HELPALL12
HELPALL3 SWI WRITEI+" "
 ADD R1,R1,#1
 CMP R1,#10
 CMPNE R1,#20
 CMPNE R1,#30
 CMPNE R1,#40
 CMPNE R1,#50
 CMPNE R1,#60
 CMPNE R1,#70
 BNE HELPALL3
HELPALL12 SWI WRITEC
 ADD R1,R1,#1
 LDRB R0,[R2],#1
 CMP R0,#&7F
 BCC HELPALL12
 ADD R2,R2,#1
 B HELPALL1 
HELPALLEND CMP R1,#0
 SWINE NEWLINE
 B CLRSTK
HELPTOKENTABLE & HELPTOKENINFO-HELPTOKEN
 & HELPTWOFUNCTION-HELPTOKEN
 & HELPTWOSTATEMENT-HELPTOKEN
 & HELPTWOCOMMAND-HELPTOKEN
HELPTOKEN ADR R0,HELPTOKEN
 LDR R1,HELPTOKENTABLE
 CMP R10,#&7F
 ADDEQ R1,R1,R0
 BEQ HELPTOKENSAY
 TEQ R10,#TESCFN
 LDREQ R1,HELPTOKENTABLE+4
 LDREQB R10,[LINE]
 TEQ R10,#TESCSTMT
 LDREQ R1,HELPTOKENTABLE+8
 LDREQB R10,[LINE]
 TEQ R10,#TESCCOM
 LDREQ R1,HELPTOKENTABLE+12
 LDREQB R10,[LINE]
 ADD R1,R1,R0
HELPTOKENFIND LDRB R0,[R1],#1
 CMP R0,#127
 BEQ HELPTOKENNO
 CMP R0,R10
 BNE HELPTOKENFIND
HELPTOKENSAY LDRB R0,[R1],#1
 CMP R0,#&7F
 SWICS NEWLINE
 BCS CLRSTK
 CMP R0,#32
 SWICS WRITEC
 BCS HELPTOKENSAY
 ADR R2,HELPWORDS
HELPWORDFIND LDRB R3,[R2],#1
 CMP R3,R0
 BNE HELPWORDFIND
HELPWORDSAY LDRB R0,[R2],#1
 CMP R0,#128
 SWIEQ NEWLINE
 BEQ HELPWORDSAY
 CMP R0,#32
 SWICS WRITEC
 BCS HELPWORDSAY
 B HELPTOKENSAY
HELPWORDS = 0,128
 = 1," the"
 = 2," of"
 = 3," number"
 = 4," structure"
 = 5," gives"
 = 6," function"
 = 7," string"
 = 8," to"
 = 9,"line"
 = 10,"x,y"
 = 11," or"
 = 12," in"
 = 13," program"
 = 14," start"
 = 15," value"
 = 16,"<number>"
 = 17," file"
 = 18,"<expression>"
 = 19," from"
 = 20," for"
 = 21,"#<channel>"
 = 22,"<string>"
 = 23," with"
 = 24," character"
 = 25,"variable"
 = 26,"statement"
 = 27," a"
 = 28," of a number (<factor>)."
 = 29,"This command"
 = 30,"This function gives the"
 = 31,"This psuedo-variable reads or sets the"
 = 1
 ]
LOAD BL LOADER
 B FSASET
LOADER STMFD SP!,{R14}
 BL AEEXPR
 BL OSSTRI
 BL AEDONE
 MOV R0,#255
 LDR R2,[ARGP,#PAGE]
 MOV R3,#0
 SWI FILE
 LDMFD SP!,{R14}
ENDER LDR R0,[ARGP,#PAGE]
FNDTOP LDRB R1,[R0]
 CMP R1,#13
 BNE BADPRO
 LDRB R1,[R0,#1]
 CMP R1,#&FF
 BEQ SETTOP
 LDRB R1,[R0,#3]
 CMP R1,#4
 ADDCS R0,R0,R1
 BCS FNDTOP
BADPRO BL VSTRNG
 = 13,10,"Bad program",10,13,0
 ALIGN
 B CLRSTK
SETTOP ADD R0,R0,#2
 STR R0,[ARGP,#TOP]
 MOV PC,R14
;print r0 in decimal
;uses r4,r1
POSITE MOV R4,#0
 B PRN
NPRN MOV R4,#5
PRN STMFD SP!,{R14,R5,R6,R2,R3}
 MOV R1,R0
 MOV R3,#4
 ADR R5,VALUES
NUMLOP MOV R0,#"0"
 LDR R6,[R5,R3,LSL #2]
00 SUBS R1,R1,R6
 ADDCS R0,R0,#1
 BCS %B00
 ADD R1,R1,R6
 CMP R0,#"0"
 MOVNE R4,#1
 TEQ R4,#1
 TEQNE R3,#0
 BEQ NUMLPA
 TEQ R4,#0
 BEQ NUMLPB
 MOV R0,#" "
NUMLPA BL CHOUT ;warning TYPE used
NUMLPB SUBS R3,R3,#1
 BCS NUMLOP
 LDMFD SP!,{PC,R5,R6,R2,R3}
VALUES & 1
 & 10
 & 100
 & 1000
 & 10000
SPCSWC MOV TYPE,#0
;Print r0 spaces
SPCOUT STMFD SP!,{R14,R1}
 MOVS R1,R0
 LDMMIFD SP!,{R1,PC}
 LDMEQFD SP!,{R1,PC}
 AND R1,R1,#255
 MOV R0,#" "
SPCLOP BL CHOUT
 SUBS R1,R1,#1
 BNE SPCLOP
 LDMFD SP!,{R1,PC}
CHOUTNOCOUNT TST R7,#128
 BEQ CHOUTS1
CHOUT TST R7,#128
 BEQ CHOUTS
 CMP TYPE,#1024
 BCC CHOUTS
 STRB R0,[TYPE],#1
 CMP TYPE,SP
 MOVCC PC,R14
 BL VSTRNG
 = 10,13,"Not enough room to call Twin for this program",10,13,0
 B FSASET
CHOUTS STMFD SP!,{R0,R1}
 LDR R0,[ARGP,#WIDTHLOC]
 LDR R1,[ARGP,#TALLY]
 CMP R0,R1
 MOVCC R1,#0
 SWICC NEWLINE
 ADD R1,R1,#1
 STR R1,[ARGP,#TALLY]
 LDMFD SP!,{R0,R1}
CHOUTS1 SWI WRITEC
 MOV PC,R14
EDIT BL OSCLIREGS
 ADR R0,EDITTXT
 SWI CLI
 CMP R0,#0
 BEQ CLRSTK
 B FSASET
EDITTXT = "ARMBE",0
 ALIGN
LIST LDRB R7,[ARGP,#LISTOP]
 LDRB R0,[LINE]
 CMP R0,#"O"
 BNE LISTGO
 ADDEQ LINE,LINE,#1
 BL AEEXDN
 CMP FACC,#32
 BCS ERLISTO
 STRB FACC,[ARGP,#LISTOP]
 B CLRSTK
TWIN MOV R7,#&80
 BL DONES
 B TWINGO
TWINO BL AEEXDN
 CMP FACC,#16
 BCS ERTWINO
 ORR R7,FACC,#&80
TWINGO BL SETFSA ;init fsa to top
 SUB LINE,LINE,#1
LISTGO MOV R4,#0 ;start 0
 MOV R5,#&FF
 ORR R5,R5,#&FE00 ;end 65279
 BL SPTSTN ;check for possible start
 BNE NONUML ;no start given
 MOV R4,R0 ;start at this line
 BL SPACES
 CMP R10,#","
 BEQ GOTCX ;followed by something
 MOV R5,R4 ;followed by nothing: set end to start
 B GOTCFF
NONUML CMP R10,#","
 BNE GOTCFF ;no number, no comma, could be IF
GOTCX BL SPTSTN
 MOVEQ R5,R0 ;second number to end
 BLEQ SPACES
GOTCFF CMP R10,#TIF
 MOV AELINE,LINE
 SUBNE AELINE,LINE,#1 ;pointer to match string
 BLNE DONE
 BL ENDER ;fault if bad program
 BL TWINBG ;get pointer for TWIN chout
 MOV FACC,R4 ;move in start line number
 BL FNDLNO ;find it
 MOV LINE,R1
 MOV R6,#0 ;clear structure space count
 B GETNUM
ENDLN MOV R0,#10
 BL CHOUTNOCOUNT
 CMP R7,#128
 SWICC WRITEI+13 ;write out return as well if to screen etc.
 MOV R0,#0
 STR R0,[ARGP,#TALLY]
GETNEW LDRB R0,[R2,#3] ;R2 has initial LINE in it
 ADD LINE,R2,R0
GETNUM LDRB R0,[LINE,#1]
 LDRB R1,[LINE,#2]
 ORR R0,R1,R0,LSL #8 ;combine to word
 CMP R0,R5 ;test against limit
 BLS LTTEST
 CMP R7,#128
 BCC CLRSTK ;end of LIST
 ADD R1,ARGP,#STRACC
 LDR R0,TWINTXT
 STR R0,[R1],#4
 MOV R0,#" "
 STRB R0,[R1],#1
 MOV R0,#"@"
 STRB R0,[R1],#1
 MOV R4,TYPE
 BL TWINBG
 BL TWINHX
 MOV R0,#","
 STRB R0,[R1],#1
 MOV TYPE,R4
 BL TWINHX
 MOV R0,#";"
 STRB R0,[R1],#1
 ADD R3,ARGP,#CALLEDNAME
TWINCOPYCALL LDRB R0,[R3],#1
 STRB R0,[R1],#1
 TEQ R0,#0
 BNE TWINCOPYCALL
 ADD R0,ARGP,#STRACC
 BL OSCLIREGS
 SWI CLI
TWINTXT = "Twin"
TWINHX MOV R2,#32-4 ;covert TYPE to string ptd to by r1
TWINLP MOV R0,TYPE,LSR R2
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 STRB R0,[R1],#1
 SUBS R2,R2,#4
 BPL TWINLP
 MOV PC,R14
TWINBG LDR TYPE,[ARGP,#FSA]
 CMP TYPE,#&9000
 MOVCC TYPE,#&9000
 MOV PC,R14
LTTEST LDRB R3,[ARGP,#ESCFLG]
 CMP R3,#&80
 BCS ESCAPE ;only reasonable exception
 MOV R4,#0 ;don't list line
 LDRB R14,[AELINE]
 CMP R14,#13
 MOVEQ R4,#1 ;list line if no search string
 MOV R3,#0 ;token expansion
 MOV R2,LINE ;save line
 ADD LINE,LINE,#4
 TEQ R6,#0
 MOVMI R6,#0 ;reset count if negative
 STMFD SP!,{R6} ;current indent
LTLOOP LDRB R10,[LINE],#1
 CMP R10,#13
 BEQ CHKLST ;finished prescan
 CMP R10,#TREM
 MOVEQ R3,R10 ;if REM flip token expansion forever
 CMP R10,#""""
 EOREQ R3,R3,R10 ;if " flip token expansion
 TEQ R3,#0
 BNE LPSIMT
 CMP R10,#TNEXT
 CMPNE R10,#TUNTIL
 CMPNE R10,#TENDWH
 CMPNE R10,#TENDCA
 CMPNE R10,#TENDIF
 SUBEQ R6,R6,#2 ;dec count
 CMP R10,#TFOR
 CMPNE R10,#TREPEAT
 ADDEQ R6,R6,#2 ;inc count
 LDRB R14,[LINE,#-2]
 TEQ R14,#TESCSTMT
 TEQNE R14,#TESCFN
 TEQNE R14,#TESCCOM
 BNE LPSIMT
 CMP R10,#TWHILE
 CMPNE R10,#TCASE
 ADDEQ R6,R6,#2
 B LTLOOP
LPSIMT TST R4,#1
 BNE LTLOOP ;already decided to list line
 MOV R1,#0 ;offset down string
LPSIMS LDRB R14,[AELINE,R1]
 CMP R14,#13
 MOVEQ R4,#1 ;listable line
 BEQ LTLOOP
 CMP R10,#TCONST
 ADDEQ LINE,LINE,#3
 CMP R14,R10
 LDRB R10,[LINE,R1]
 ADD R1,R1,#1
 BEQ LPSIMS ;loop if equal
 B LTLOOP
CHKLST LDRB R14,[LINE,#-2]
 CMP R14,#TTHEN
 ADDEQ R6,R6,#2 ;do multiline if then else endif
 LDMFD SP!,{R3} ;old count
 CMP R3,R6
 MOVCS R3,R6 ;use minimum
 TEQ R4,#0
 BEQ GETNEW
 ADD LINE,R2,#4 ;first char to list
 BL LISTLINE
 B ENDLN
LISTLINE STMFD SP!,{R14}
 TST R7,#8
 BLEQ NPRN
 MOV R4,#0
 ANDS R0,R7,#1
 BLNE SPCOUT
 B LPSD1
LPSD TST R7,#4
 BEQ LPQUOT
 BL CHOUT
 MOV R0,#10
 BL CHOUTNOCOUNT
 CMP R7,#128
 MOV R0,#13
 BLCC CHOUTNOCOUNT
 MOV R0,#0
 STR R0,[ARGP,#TALLY]
 AND R0,R7,#1
 TST R7,#8
 ADDEQ R0,R0,#5
 BL SPCOUT
LPSD1 MOVS R0,R3
 TSTNE R7,#2
 BLNE SPCOUT
 B LP
LPQUOT BL CHOUT
LP LDRB R0,[LINE],#1
 CMP R0,#13
 LDMEQFD SP!,{PC}
 CMP R0,#""""
 EOREQ R4,R4,#1 ;flip expansion flag
 TEQ R4,#0
 BNE LPQUOT
 TEQ R0,#":"
 BEQ LPSD
 CMP R0,#&7F
 BCC LPQUOT
 CMP R0,#TCONST
 BNE LPSIMP
 BL SPGETN
 BL POSITE
 MOV R4,#0
 TST R7,#8
 BEQ LP
 CMP R7,#128
 SWICC NEWLINE
 B USESLINENUMBERS
LPSIMP CMP R0,#TREM
 MOVEQ R4,#4 ;no more expansion after this
 BL TOKOUT
 B LP
LVAR ROUT
 BL DONES
 BL VSTRNG
 = "Static Integer variables:               @% = &",0
 ADD R7,ARGP,#INTVAR
 LDR R10,[R7],#4
 BL WORDHX
 MOV R6,#"A"
 MOV R5,#3
10 ADD R10,R0,#5
 ADD R5,R5,#1
 TST R5,#3
 SWIEQ NEWLINE
 BEQ %12
13 SWI WRITEI+" "
 ADD R10,R10,#1
 CMP R10,#20
 BCC %13
12 MOV R0,R6
 SWI WRITEC
 BL VSTRNG
 = "% = ",0
 LDR FACC,[R7],#4
 BL LVRPINT
 ADD R6,R6,#1
 TEQ R6,#"Z"+1
 BNE %10
 SWI NEWLINE
 ADD R5,ARGP,#VARPTR
 ADD R7,R5,#("z"+1-"A")*4
 MOV R6,#"A"-1
21 ADD R6,R6,#1
 TEQ R5,R7
 BEQ LVARDX
 LDR R4,[R5],#4
 TEQ R4,#0
 BEQ %21
 BL VSTRNG
 = "Dynamic variables:",0
 MOV R11,#256
 B %20
22 LDR R4,[R5],#4 ;head of chain
23 TEQ R4,#0
 BEQ %29
20 RSBS R0,R11,#20
 RSBLSS R0,R11,#40
 RSBLSS R0,R11,#60
 SWILS NEWLINE
 MOVLS R11,#0
 BLS LVRDFF
 ADD R11,R11,R0
 MOV TYPE,#0
 BL SPCOUT
LVRDFF MOV R2,R4
 LDR R4,[R2],#4 ;next in chain
 MOV R0,R6
 SWI WRITEC
LVRDNO ADD R11,R11,#1
 LDRB R0,[R2],#1
 TEQ R0,#0
 SWINE WRITEC
 BNE LVRDNO
 MOV R0,R2
 LDRB R2,[R0,#-2]
 TEQ R2,#"("
 BEQ %24
 TEQ R2,#"$"
 BEQ %25
 TEQ R2,#"%"
 MOVEQ TYPE,#4
 MOVNE TYPE,#5
 ADDEQ R0,R0,#3
 BICEQ R0,R0,#3
 BL VARIND
 SWI WRITES
 = " = ",0
 ADD R11,R11,#3
 STMFD SP!,{R4}
 BL LVRPRT
 LDMFD SP!,{R4}
 B %23
24 ADD R0,R0,#3
 BIC R0,R0,#3
 LDR R2,[R0]
 CMP R2,#16
 BCC LVRDAN
 LDR R0,[R2],#4
LVRDAP SUB R0,R0,#1
 STMFD SP!,{R2,R4}
 BL LVRPINT
 LDMFD SP!,{R2,R4}
 LDR R0,[R2],#4
 ADD R11,R11,#1
 TEQ R0,#0
 SWINE WRITEI+","
 BNE LVRDAP
 SWI WRITEI+")"
 B %23
LVRDAN CMP R2,#1
 BEQ LVRDAN2
 BL VSTRNG
 = "undimensioned)",0
 ADD R11,R11,#14
 B %23
LVRDAN2 BL VSTRNG
 = "local)",0
 ADD R11,R11,#6
 B %23
25 MOV TYPE,#128
 BL VARIND
 BL VSTRNG
 = " = """,0
 ADD R11,R11,#5
 ADD R1,ARGP,#STRACC
 TEQ R1,CLEN
 BEQ %28
27 LDRB R0,[R1],#1
 TEQ R0,#127
 CMPNE R0,#" "-1
 MOVLS R0,#"."
 SWI WRITEC
 ADD R11,R11,#1
 TEQ R1,CLEN
 BNE %27
28 SWI WRITEI+""""
 B %23
29 ADD R6,R6,#1
 TEQ R5,R7
 BNE %22
 SWI NEWLINE
LVARDX LDR R1,[ARGP,#PROCPTR]
 TEQ R1,#0
 BEQ LVARPX
 BL VSTRNG
 = "Procedures:",10,13,0
 MOV R11,#0
LVARP1 BL LVARFMT
 BL VSTRNG
 = "PROC",0
 ADD R11,R11,#3
 BL LVARFN
 BNE LVARP1
 SWI NEWLINE
LVARPX LDR R1,[ARGP,#FNPTR]
 TEQ R1,#0
 BEQ LVARLIB
 BL VSTRNG
 = "Functions:",10,13,0
 MOV R11,#0
LVARF0 BL LVARFMT
 BL VSTRNG
 = "FN",0
 ADD R11,R11,#1
 BL LVARFN
 BNE LVARF0
 SWI NEWLINE
LVARLIB LDR R1,[ARGP,#LIBRARYLIST]
 TEQ R1,#0
 BEQ LVARINST
 BL VSTRNG
 = "Libraries:",10,13,0
 ALIGN
LVARLIB0 ADD LINE,R1,#8
 BL LVARLINE
 LDR R1,[R1]
 CMP R1,#0
 BNE LVARLIB0
LVARINST LDR R1,[ARGP,#INSTALLLIST]
 TEQ R1,#0
 BEQ LVARDONE
 BL VSTRNG
 = "Installed libraries:",10,13,0
 ALIGN
LVARILIB0 ADD LINE,R1,#8
 BL LVARLINE
 LDR R1,[R1]
 CMP R1,#0
 BNE LVARILIB0
LVARDONE B CLRSTK
;list first line of program without line number!
LVARLINE MOV R7,#8
 LDRB R0,[LINE,#-2]
 CMP R0,#255
 MOVEQ PC,R14
 STMFD SP!,{R1,R14}
 BL LISTLINE
 SWI NEWLINE
 LDMFD SP!,{R1,PC}
;list functions or procedures
LVARFN STMFD SP!,{R14,R8}
 LDR R10,[R1],#4
 MOV R0,R1
 SWI WRITE0
 SUB R1,R0,R1
 ADD R11,R11,R1
 ADD R0,R0,#3
 BIC R7,R0,#3
 LDMFD R7!,{R0,R1}
 TEQ R0,#0
 BEQ LVARF1
 SWI WRITEI+"("
 ADD R11,R11,#2
LVARFA TST R1,#&100
 BEQ %41
 TST R1,#&8000
 BNE %41
 BL VSTRNG
 = "RETURN ",0
 ADD R11,R11,#7
41 ANDS R2,R1,#255
 BNE %42
 BL VSTRNG
 = "byte",0
 ADD R11,R11,#4
42 TEQ R2,#4
 BNE %43
 BL VSTRNG
 = "integer",0
 ADD R11,R11,#7
43 TEQ R2,#5
 BNE %44
 BL VSTRNG
 = "real",0
 ADD R11,R11,#4
44 TEQ R2,#128
 BNE %45
 BL VSTRNG
 = "string",0
 ADD R11,R11,#6
45 CMP R2,#129
 BCC %46
 BL VSTRNG
 = "$ string",0
 ADD R11,R11,#8
46 TST R1,#&8000
 BEQ %49
 BL VSTRNG
 = " array",0
 ADD R11,R11,#6
49 LDMFD R7!,{R0,R1}
 TEQ R0,#0
 ADDNE R11,R11,#1
 SWINE WRITEI+","
 BNE LVARFA
 SWI WRITEI+")"
LVARF1 MOVS R1,R10
 LDMFD SP!,{R8,PC}
LVARFMT STMFD SP!,{R14}
 TEQ R11,#0
 BEQ LVRFMX
 RSBS R0,R11,#40
 SWILS NEWLINE
 MOVLS R11,#0
 BLS LVRFMX
 ADD R11,R11,R0
 MOV TYPE,#0
 BL SPCOUT
LVRFMX LDMFD SP!,{PC}
LVRPINT MOV TYPE,#TINTEGER
LVRPRT MOV FWACC,#&900 ;TEMPORARY!
 STMFD SP!,{R5,R6,R7,R14}
 MOV R5,#0
 BL FCONFP
 ADD R0,ARGP,#STRACC
 MOV R5,#0
 STRB R5,[TYPE]
 SWI WRITE0
 ADD R0,ARGP,#STRACC
 SUB R0,TYPE,R0
 ADD R11,R11,R0
 LDMFD SP!,{R5,R6,R7,PC}
OLD BL DONES
 MOV R0,#0
 LDR R1,[ARGP,#PAGE]
 STRB R0,[R1,#1]
 BL ENDER
 B FSASET
RENUM BL GETTWO
 BL RENUM1
 B FSASET
RENUM1 LDR R0,[ARGP,#PAGE]
RENUM2 STMFD SP!,{R0,R14,TYPE} ;renumber from r4 step r5 starting at r0
 BL ENDER
 LDR R7,[ARGP,#TOP]
 LDR R1,[SP]
NUMBA LDRB R10,[R1,#1] ;phase 1: remember current line numbers
 CMP R10,#&FF
 BEQ NUMBB
 STRB R10,[R7],#1
 LDRB R10,[R1,#2]
 STRB R10,[R7],#1
 LDRB R10,[R1,#3]
 ADD R1,R1,R10
 CMP R7,SP
 BCC NUMBA
 B ERNUMM
NUMBB LDR R1,[SP]
NUMBC LDRB R10,[R1,#1]
 CMP R10,#&FF
 BEQ NUMBD
 CMP R4,#65280
 BCS NUMBCFAIL
 STRB R4,[R1,#2]
 MOV R0,R4,LSR #8
 STRB R0,[R1,#1]
 ADD R4,R4,R5
 LDRB R10,[R1,#3]
 ADD R1,R1,R10
 B NUMBC
NUMBCFAIL LDR R6,[ARGP,#TOP]
 LDR R1,[SP]
NUMBCFAIL1 LDRB R0,[R6],#1
 STRB R0,[R1,#1]
 LDRB R0,[R6],#1
 STRB R0,[R1,#2]
 LDRB R0,[R1,#3]
 ADD R1,R1,R0
 CMP R6,R7
 BCC NUMBCFAIL1
 B ERNUMO
NUMBD LDR LINE,[SP]
 ADD LINE,LINE,#1
NUMBE LDRB R10,[LINE],#1
 CMP R10,#&FF
 LDMEQFD SP!,{R0,TYPE,PC}
 LDRB R7,[LINE],#1
 ADD R7,R7,R10,LSL #8
 ADD LINE,LINE,#1
 MOV TYPE,#0 ;in strings
NUMBF LDRB R10,[LINE],#1
 CMP R10,#""""
 EOREQ TYPE,TYPE,#1
 CMP R10,#13
 BEQ NUMBE
 TEQ TYPE,#0
 BNE NUMBF
 CMP R10,#TREM
 CMPNE R10,#TDATA
 MOVEQ TYPE,#2
 CMP R10,#TCONST
 BNE NUMBF
 MOV AELINE,LINE
 BL SPGETN
;have line number in R0
;must search cross reference for it
 LDR R4,[ARGP,#TOP]
 LDR R5,[SP]
NUMBH LDRB R10,[R5,#1]
 CMP R10,#&FF
 BEQ NUMBJ
 LDRB R2,[R4],#1 ;hi
 LDRB R1,[R4],#1 ;lo
 ORR R1,R1,R2,LSL #8
 CMP R1,R0
 LDRNEB R1,[R5,#3] ;if not found, continue
 ADDNE R5,R5,R1
 BNE NUMBH
;found number in xref process
 LDRB R5,[R5,#2] ;get lo byte of new number
 ORR R5,R5,R10,LSL #8; new number
 MOV R2,AELINE
 BL CONSTI
 B NUMBF
NUMBJ MOV R1,R0
 BL VSTRNG
 = "Failed with ",0
 MOV R0,R1
 BL POSITE
 BL VSTRNG
 = " on line ",0
 MOV R0,R7
 BL POSITE
 SWI NEWLINE
 B NUMBF
SAVE BL SPACES
 TEQ R10,#13
 BEQ SAVEIC
 SUB LINE,LINE,#1
 BL AEEXPR
 BL OSSTRI
 BL AEDONE
 BL ENDER
 ADD R1,ARGP,#STRACC
SAVEFIL MOV R0,#1 ;fetch date stamp
 STMFD SP!,{R1}
 SUB R1,SP,#8
 MVN R2,#0
 SUB R2,R2,#&F00-&B00
 STR R2,[R1,#4]
 SWI WORD
 MOV R0,#0
 LDR R2,[R1,#4]
 LDR R3,[R1]
 LDMFD SP!,{R1}
 LDR R4,[ARGP,#PAGE]
 LDR R5,[ARGP,#TOP]
 SWI FILE
 B CLRSTK
SAVEIC BL ENDER
 LDR R1,[ARGP,#PAGE]
 LDRB R0,[R1,#1]
 CMP R0,#&FF
 BEQ BADIC
 ADD R1,R1,#4
SAVEI2 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ SAVEI2
 TEQ R0,#TREM
 BNE BADIC
SAVEI3 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ SAVEI3
 TEQ R0,#">"
 BEQ SAVEFIL
 B BADIC
 LNK Stmt
